# python3种空间

# 全局命名空间
# 当py文件开始运行时，py解释器会申请内存并开始逐行解释文件，会在内存中申请一块空间来存
# 放py文件中的变量与值之间的关系，当解释器遇到定义函数时
# 只存放函数名与相应的地址，不会空滤函数内的变量和逻辑；这样的空间就叫全局命名空间

# 局部命名空间
# 当遇到函数的执行者是，会再重新申请一块内存空间，用来存放函数体中的变量与之的关系，当函数只想完毕时
# 内容清空，内存会被回收，这样的空间就叫局部命名空间，继续加载py文件直至py文件运行结束，全局命名也会回收。

# 内置命名空间
# 在运行py文件时，同全局命名空间一同申请用来存放内置函数和特殊变量，print input list int len等

# 空间及变量的加载顺序
# 内置——>全局-->(遇到函数执行者，加载局部)——>否则结束

# 作用域
"""
# 就是变量使用权可以覆盖的范围
# 内置可以覆盖到全局和局部命名空间
# 全局可以覆盖到本身和局部
# 局部只能覆盖自身
# 在函数运行时会向上寻找变量
print(print)  # 内置
name = 10  # 全局
print(name)


def func():
    # name = 20 # 局部
    print(name)


func()
# 在处理内置函数时，会重新申请一块局部空间，不会再func2的空间上拓展


def func2():
    a = 10

    def inner():
        b = 20
        print(a)

    inner()


func2()
"""


# 关键字 globals() locals()
"""
name = 'alex'


def func():
    age = 20
    print(globals())    # 打印全局命名空间的内容
    print(locals())     # 打印当前所在空间的内容


func()
"""

# 高阶函数（嵌套）
"""
def func1():
    print(1)

    def func2():
        print(3)
    print(2)
    func2()
    print(4)


func1()


def func3():
    print(0)
    func1()
    print(6)

func3()
"""





